package redecolaborativa.client;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.dom.client.MouseOutEvent;
import com.google.gwt.event.dom.client.MouseOutHandler;
import com.google.gwt.event.dom.client.MouseOverEvent;
import com.google.gwt.event.dom.client.MouseOverHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.CaptionPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.TextArea;

public class PaginaInicial  implements EntryPoint {
	private FachadaAsync fachada;
	private String login, idSessao;
	final RootPanel rootPanel = RootPanel.get();
	ScrollPanel painelPrincipal;
	
	public PaginaInicial(FachadaAsync fachada, String login, String idSessao) {
		this.fachada = fachada;
		this.login = login;
		this.idSessao = idSessao;
	}

	@Override
	public void onModuleLoad() {
		rootPanel.setStyleName("rootPanel");
		rootPanel.setSize("1100px", "400px");
		
		Label saudacao = new Label("Bem vindo(a), " + login + ".");
		rootPanel.add(saudacao, 27, 114);
		
		painelPrincipal = new ScrollPanel();
		painelPrincipal.setSize("1337px", "502px");
		PainelPaginaInicial painelPaginaInicial = new PainelPaginaInicial(fachada, painelPrincipal, login, idSessao);
		painelPaginaInicial.setSize("1333px", "494px");
		painelPrincipal.add(painelPaginaInicial);
		rootPanel.add(painelPrincipal, 25, 146);
		
		paginaInicial();
		visualizarPerfil();
		encerrarSessao();
		localizarUsuario();
	}
	
	private void paginaInicial() {
		Button btnPaginaInicial = new Button("Pagina Inicial");
		btnPaginaInicial.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				painelPrincipal.clear();
				painelPrincipal.add(new PainelPaginaInicial(fachada, painelPrincipal, login, idSessao));
			}
			
		});
		rootPanel.add(btnPaginaInicial, 1062, 45);
		btnPaginaInicial.setSize("108px", "30px");
	}
	
	private void visualizarPerfil() {
		Button btnMeuPerfil = new Button("Meu Perfil");
		btnMeuPerfil.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				painelPrincipal.clear();
				painelPrincipal.add(new Perfil(fachada, painelPrincipal, idSessao, login, login));
			}
		});
		rootPanel.add(btnMeuPerfil, 1176, 45);
		btnMeuPerfil.setSize("98px", "30px");
	}

	private void localizarUsuario() {		
		CaptionPanel cptnpnlNewPanel = new CaptionPanel("Buscar Usu\u00E1rio");
		cptnpnlNewPanel.setStyleName("new-caption");
		rootPanel.add(cptnpnlNewPanel, 691, 10);
		cptnpnlNewPanel.setSize("326px", "64px");
		
		AbsolutePanel absolutePanelCaption = new AbsolutePanel();
		cptnpnlNewPanel.setContentWidget(absolutePanelCaption);
		absolutePanelCaption.setSize("325px", "55px");
		
		final TextArea usuarioPesquisa = new TextArea();
		absolutePanelCaption.add(usuarioPesquisa, 0, 0);
		usuarioPesquisa.setText("Usuario");
		usuarioPesquisa.setSize("210px", "18px");

		final RadioButton opcaoPesquisaUsuarioNome = new RadioButton("new name", "NOME");
		opcaoPesquisaUsuarioNome.setHTML("Nome");
		absolutePanelCaption.add(opcaoPesquisaUsuarioNome, 23, 34);
		final RadioButton opcaoPesquisaUsuarioEndereco = new RadioButton("new name", "ENDERE\u00C7O");
		opcaoPesquisaUsuarioEndereco.setHTML("Endere\u00E7o");
		absolutePanelCaption.add(opcaoPesquisaUsuarioEndereco, 108, 34);
		
		Button btnBuscarUsuarios = new Button("Buscar");
		absolutePanelCaption.add(btnBuscarUsuarios, 226, 0);
		btnBuscarUsuarios.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				fachada.getSessao(login, new AsyncCallback<Integer>() {
					@Override
					public void onFailure(Throwable caught) {
						Window.alert(caught.getMessage());
					} @Override
					public void onSuccess(Integer result) {
						String opcaoBusca = selecionaOpcaoDeBuscaDeUsuario(opcaoPesquisaUsuarioNome, opcaoPesquisaUsuarioEndereco);
						fachada.localizarUsuario(String.valueOf(result), usuarioPesquisa.getText(), opcaoBusca, new AsyncCallback<String>() {
							@Override
							public void onFailure(Throwable caught) {
								Window.alert(caught.getMessage());								
							} @Override
							public void onSuccess(String result) {
								painelPrincipal.clear();
								painelPrincipal.add(new PainelPaginaInicial(fachada, painelPrincipal, login, idSessao));
								PainelPaginaInicial.getPainelGeral().clear();
								listaUsuariosLocalizados(result);
							}
						});
					}
				});
			}
		});
		btnBuscarUsuarios.setSize("96px", "30px");
	}
	
	private void listaUsuariosLocalizados(final String result) {
		AbsolutePanel painel = new AbsolutePanel();
		PainelPaginaInicial.getPainelGeral().add(painel);
		if (result.isEmpty()) {
			painel.add(new Label("Nenhum usuario encontrado."));
		} else {
			final String[] usuarios = result.split("; ");
			for (int i = 0; i < usuarios.length; i++) {
				final String dadosUsuario = usuarios[i];
				Label usuario = new Label(dadosUsuario);
				painel.add(usuario);
				eventoDeMouseOver(usuario);
				usuario.addClickHandler(new ClickHandler() {
					@Override
					public void onClick(ClickEvent event) {
						painelPrincipal.clear();
						painelPrincipal.add(new Perfil(fachada, painelPrincipal, idSessao, login, dadosUsuario.split(" - ")[2]));
					}
				});
			}
		}
	}
	
	private void eventoDeMouseOver(final Label label) {
		label.addMouseOverHandler(new MouseOverHandler() {
			@Override
			public void onMouseOver(MouseOverEvent event) {
				label.setStyleName("underlined");
			}
		});
		label.addMouseOutHandler(new MouseOutHandler() {
			@Override
			public void onMouseOut(MouseOutEvent event) {
				label.setStyleName("gwt-Label");								
			}
		});
	}

	@SuppressWarnings("deprecation")
	private String selecionaOpcaoDeBuscaDeUsuario(RadioButton opcao1, RadioButton opcao2) {
		String opcaoBusca = null;
		if (opcao1.isChecked()) {
			opcaoBusca = "nome";
		} else if (opcao2.isChecked()) {
			opcaoBusca = "endereco";
		} 
		return opcaoBusca;
	}

	private void encerrarSessao() {
		Button btnSair = new Button("Sair");
		btnSair.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				rootPanel.clear();
				PaginaLoginCadastro paginaLoginCadastro = new PaginaLoginCadastro();
				paginaLoginCadastro.onModuleLoad();
			}
		});
		rootPanel.add(btnSair, 1280, 45);
		btnSair.setSize("82px", "30px");
	}
}